WSL 中调用 Windows 应用的一点记录
最近将部分项目的开发环境从 Windows 迁移到了 WSL,记录一下迁移过程中遇到的问题。
WSL 中 Chrome Devtools MCP 无法连接 Windows Chrome
之前我在 Claude Code 安装了 Chrome Devtools MCP 来调试网页,迁移到 WSL 之后我也照旧安装了相关 MCP:
# --autoConnect 参数是为了复用已经打开的浏览器
claude mcp add --scope user chrome-devtools-mcp -- pnpx chrome-devtools-mcp@latest --autoConnect但在 WSL 中,每次 MCP 打开的浏览器都是 WSL 内的 Chrome,而不是我想要的 Windows Chrome。
分析
Chrome 在 chrome://inspect 中启用 Remote Debugging 之后,会在用户数据目录生成一个名为 DevToolsActivePort 的文件,Windows 平台用户数据目录在:~\AppData\Local\Google\Chrome\User Data,而 Linux 则是 ~/.config/google-chrome。
文件内容如下:
12000
/devtools/browser/4f23fe57-2e06-40f0-90d6-f5ba4785a39f第一行是 Chrome 远程调试对应的端口号,第二行是浏览器级别的 WebSocket 调试端点路径,两者拼在一起就是完整的CDP(Chrome DevTools Protocol) 连接地址:
ws://127.0.0.1:12000/devtools/browser/4f23fe57-2e06-40f0-90d6-f5ba4785a39f思路
WSL 中的 Devtools MCP 工具每次都会去 WSL 内的浏览器数据目录读取 DevToolsActivePort,有没有办法让 Devtools MCP 去读取 Windows Chrome 数据目录呢? 那自然是有的。
从 Chrome 官方博客的这篇文章中可以看到,Devtools MCP 支持一个叫做 --channel 的参数,这个参数可以用来指定不同频道的 Chrome,如:stable、canary、beta、dev,默认 stable 。
不同频道的 Chrome 数据目录不同,因此,我们可以将 Devtools MCP 的 --channel 参数设置为 WSL 中未安装的 Chrome 频道,然后将 Windows 中浏览器数据文件夹软连接到 WSL 中对应 Chrome 频道配置文件夹,即可实现 WSL 中的 Claude Code 使用 Devtools MCP 操纵 Windows Chrome 的需求。
代码
这里以 Chrome Canary 频道为例,先建立软连接:
# 把 <WinUser> 换成你的 Windows 用户名
ln -s "/mnt/c/Users/<WinUser>/AppData/Local/Google/Chrome/User Data" ~/.config/google-chrome-canary
# 检查一下链接是否生效:
cat ~/.config/google-chrome-canary/DevToolsActivePort然后在 Claude Code 中添加新的 MCP:
claude mcp remove chrome-devtools-mcp
claude mcp add -scope user chrome-devtools-mcp -- pnpx chrome-devtools-mcp@latest --autoConnect --channel=canary现在,Devtools MCP 会去读取 Chrome Canary Linux 对应配置目录里的 DevToolsActivePort,即 ~/.config/google-chrome-canary/DevToolsActivePort,而由于软连接的存在,它实际上会读取 Windows Chrome 实际使用的端口。
- PS: WSL 网络模式必须为 Mirrored,这样 WSL 的 127.0.0.1 就是 Windows 本机,Devtools MCP 才能访问 Windows Chrome 监听端口。
WSL 中操作 Windows Terminal
我日常的工作流程是这样的:打开 VSCode,Ctrl + ` 打开终端,然后输入 tt 来打开 Windows Terminal,工作目录为当前目录,然后在 Windows Terminal(以下简称 WT)中执行各种操作。
tt 是我自定义的一个 pwsh 方法:
wt -w 0 -d .
# wt -> wt.exe 即 Windows Terminal
# -w 0 指向当前已打开的的 WT 实例,如果存在则开新 Tab,不存在启动新的 WT
# -d . 启动时的工作目录那么到了 WSL 中,怎么操作 WT 呢? 其实很简单,因为 WSL 中可以直接调用 Windows 中的 exe 程序!甚至连 Windows PATH Env 都已经加载进了 WSL Path 中。
因此,可以直接在 WSL 中执行 Windows 程序:
wt.exe -w 0 nt -p "PowerShell" pwsh -c wsl.exe --cd "$PWD"上面这段 shell 命令可以通过 WT 开启一个新的 Tab,并在新的 Tab 中启动 WSL,并切换到指定的工作目录。
我用的是 zsh,并安装了 oh-my-zsh,因此,可以在 ~/.oh-my-zsh/custom 中新建一个 functions.zsh 文件,在这个文件内维护一些常用的工具方法:
tt() {
wt.exe -w 0 nt -p "PowerShell" pwsh -c wsl.exe --cd "$PWD"
}这些方法会被 oh-my-zsh 自动加载进 shell 中,调用时输入 tt 即可~ 。
ChatGPT Desktop
ChatGPT Desktop 在 Windows 侧的体验着实不错,也支持将 Agent 运行时从 Windows Native 切换到 WSL 。但切换后,读取的 AGENTS.md 和 MCP 配置仍然是 Windows 侧,不会如我想象中去读取 WSL 中的相关 codex 配置。
因此,在 WSL 环境下,暂时只能继续使用 Codex CLI 了。